"""
Handle for monitor related functions, such as 
    - scaling and padding for different resolutions
    - getting the current resolution
    - TODO: getting main monitor & resolution

"""

from logger import logger as log

import sys
import ctypes

# Resolutions for for padding
resolution_list = [
    {"width": 1280, "height": 720},
    {"width": 1920, "height": 1080},
    {"width": 2560, "height": 1440},
    {"width": 3840, "height": 2160},
]


def get_resolution() -> tuple[int, int]:
    """
    获取当前显示器的分辨率。

    无参数。

    返回值:
       tuple[int, int]: 返回一个包含宽度和高度的元组，单位为像素。
    """
    global width, height
    print("Getting resolution")
    try:
        if sys.platform == "win32":
            # 在Windows平台上设置进程为DPI独立模式
            ctypes.windll.shcore.SetProcessDpiAwareness(2)
        # # 使用tkinter获取屏幕宽度和高度
        # tk = tkinter.Tk()
        # width, height = tk.winfo_screenwidth(), tk.winfo_screenheight()
        width, height = ctypes.windll.user32.GetSystemMetrics(0),ctypes.windll.user32.GetSystemMetrics(1)
        return width, height
    except Exception as e:
        # 记录无法获取显示器分辨率的严重错误
        log.critical("Could not retrieve monitor resolution: \n %d", e)
        raise Exception("Could not retrieve monitor resolution: \n %d", e)


width, height = get_resolution()


# Scaling functions for different resolutions support
def scaling(pos_list):
    global width, height, resolution_list
    """
    根据给定的宽高（相对于2560x1440的标准化尺寸）调整位置列表中的位置。
    该函数会遍历resolution_list列表，检查当前分辨率的高度是否与列表中的任何条目匹配。
    如果匹配，则将reso_21设置为True，并退出循环。
    此函数将动态计算当前分辨率与设计目标2560x1440之间的差异，并为应对21:9的宽高比添加必要的外边距。

    参数:
    - pos_list: 一个包含两个元素的列表，代表要调整位置的x和y坐标。

    返回值:
    - 返回一个包含两个整数的元组，代表调整后的x和y坐标。
    """

    reso_21 = False
    # 遍历分辨率列表，检查当前高度是否匹配，并处理非标准宽高比的情况
    for x in resolution_list:
        if height == x["height"]:
            if width != x["width"]:
                reso_21 = True
                x = pos_list[0]
                break

    # 如果不是特殊的21:9宽高比，则按宽度比例调整x坐标
    if reso_21 != True:
        x = pos_list[0] * width

    # 按高度比例调整y坐标
    y = pos_list[1] * height
    # 为x坐标添加外边距
    x = x + padding()

    # 记录调整前后的坐标信息
    log.debug("Scaling: {} -> {}".format(pos_list, (int(x), int(y))))

    # 返回调整后的坐标作为整数元组
    return (int(x), int(y))


def padding():
    global width, height, resolution_list
    
    """
    计算当前分辨率所需的填充宽度。
    
    该函数遍历分辨率列表（resolution_list），寻找与当前分辨率高度匹配的条目。
    如果找到匹配项，它将计算当前分辨率宽度与16:9（reso_16）分辨率宽度之间的差值，
    并将此差值除以2，以确定每侧需要的填充宽度。
    
    使用的变量：
    width -- 当前分辨率的宽度。
    height -- 当前分辨率的高度。
    pad -- 用于输出在不同分辨率下预期的填充宽度。
    reso_16 -- 包含多个16:9分辨率宽度和高度的列表，用于比较和计算。
    
    返回值：
    返回计算出的填充宽度值。
    """
    
    padding = 0
    for x in resolution_list:  # 遍历分辨率列表，寻找与当前高度匹配的分辨率
        if height == x["height"]:
            padding = (width - x["width"]) / 2  # 计算并设置填充宽度
    
    return padding
